/* Copyright 2011-2014 Kyle Michel, Logan Ward, Christopher Wolverton
 *
 * Contact: Kyle Michel (kylemichel@gmail.com)
 *			Logan Ward (LoganWard2012@u.northwestern.edu)
 *
 *
 * This file is part of Mint.
 *
 * Mint is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General
 * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your
 * option) any later version.
 *
 * Mint is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 * for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License along with Mint.  If not, see
 * <http://www.gnu.org/licenses/>.
 */



#include "help.h"
#include "output.h"



/* void Help::run(const Words& args)
 *
 * Help launcher
 */

void Help::run(const Words& args)
{
	
	// Check for known arguments
	for (int i = 0; i < args.length(); ++i)
	{
		if (args[i].equal("interface", false, 3))
		{
			interface();
			return;
		}
		if (args[i].equal("functions", false, 3))
		{
			functions();
			return;
		}
		if (args[i].equal("settings", false, 3))
		{
			settings();
			return;
		}
	}
	
	// Nothing was found so show general help
	general();
}



/* void Help::general()
 *
 * General help information
 */

void Help::general()
{
	
	// Set output method
	PrintMethod origMethod = Output::method();
	Output::method(STANDARD);
	
	// Print details
	Output::newline(); Output::print("Command line interface: mint -help interface");
	Output::newline(); Output::print("   Available functions: mint -help functions");
	Output::newline(); Output::print("         Settings file: mint -help settings");
	
	// Reset output method
	Output::method(origMethod);
}



/* void Help::interface()
 *
 * Print interface information
 */

void Help::interface()
{
	
	// Set output method
	PrintMethod origMethod = Output::method();
	Output::method(STANDARD);
	
	// Print
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" General");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("A single call to mint should have the form: ");
	Output::newline();
	Output::newline(); Output::print("    mint _files -_function1 _arguments1 -_function2 _arguments2");
	Output::newline();
	Output::newline(); Output::print("Here, _files is a list of files that will be read on startup. All files should");
	Output::newline(); Output::print("appear before the first function call. Each function is preceded by a - sign.");
	Output::newline(); Output::print("In general, only the first few letters are needed for a function name. A list of");
	Output::newline(); Output::print("arguments needed for the function should appear after the call. Any number of");
	Output::newline(); Output::print("functions can be called at a given time; with the exception of settings, they");
	Output::newline(); Output::print("will be executed in the order in which they appear. Those functions that change");
	Output::newline(); Output::print("settings (e.g. -tolerance) will be executed before all others.");
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("Any number of files can be passed in a single call to mint. Their order does");
	Output::newline(); Output::print("not matter and their formats will be determined automatically. The following");
	Output::newline(); Output::print("file formats are supported as input:");
	Output::newline(); Output::print("    * Structure (vasp 4, vasp 5, mint, cif, quantum espresso)");
	Output::newline(); Output::print("    * Settings");
	Output::newline(); Output::print("    * Potential");
	Output::newline(); Output::print("    * Xray pattern (mint, pdf xml)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" Settings");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("Settings can be changed using a settings file supplied to mint using e.g.:");
	Output::newline();
	Output::newline(); Output::print("    mint _settingsFile _files -_function1 ...");
	Output::newline();
	Output::newline(); Output::print("where _settingsFile is the name of the settings file, _files are any other");
	Output::newline(); Output::print("files, and -_function1 is the first function to perform. Multiple settings");
	Output::newline(); Output::print("files can be supplied in a single call. For example, in the call to");
	Output::newline();
	Output::newline(); Output::print("    mint _settings1 _settings2 _files -_function1 ...");
	Output::newline();
	Output::newline(); Output::print("settings in _settings1 would be applied, followed by _settings2 (overwriting");
	Output::newline(); Output::print("values in _settings1 if defined also in _settings2). Any settings applied on");
	Output::newline(); Output::print("the command line (e.g. -tolerance) overwrite anything supplied by file.");
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("A global settings file can also be created to change default values. This");
	Output::newline(); Output::print("file should be named \".mint_settings\" and appear in your home directory.");
	Output::newline(); Output::print("Mint will automatically read this file if it is present. These settings have");
	Output::newline(); Output::print("the lowest weight and are overwritten by any files or settings passed in on");
	Output::newline(); Output::print("the command line.");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" Output");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General output will be directed to stdout. However, for some functions (e.g.");
	Output::newline(); Output::print("optimizations) more detailed log files will be created in order to organize");
	Output::newline(); Output::print("output more efficiently. General output is divided into two catagories: runtime");
	Output::newline(); Output::print("and results.");
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("Runtime output shows details of each function call as they occur. This can be");
	Output::newline(); Output::print("useful be degbugging purposes and may give more detailed information than what");
	Output::newline(); Output::print("is shown in the results. Each line from runtime output is preceeded by o:, w:,");
	Output::newline(); Output::print("or e:, which coorespond to ordinary output, warnings, and errors, respectively.");
	Output::newline(); Output::print("Warnings and errors are always shown, but ordinary output can be supressed since");
	Output::newline(); Output::print("it often gives far more information than is needed (see the setting");
	Output::newline(); Output::print("\"displaylevel\" or the function \"-display\").");
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("The other output category, results, is always printed. Results are not preceded");
	Output::newline(); Output::print("by any identifier (o, w, or e) and will be printed to stdout (with the exception");
	Output::newline(); Output::print("of structures, which may be printed to a file - see the setting \"usestdout\"");
	Output::newline(); Output::print("or the function \"-print\").");
	
	// Reset output method
	Output::method(origMethod);
}



/* void Help::functions()
 *
 * Print functions
 */

void Help::functions()
{
	
	// Set output method
	PrintMethod origMethod = Output::method();
	Output::method(STANDARD);
	
	// Print overview
	Output::newline(); Output::print("List of functions in this document and brief descriptions:");
	Output::newline();
	Output::newline(); Output::print("            -help   Print help file");
	Output::newline(); Output::print("               -n   Set the number of processors in external mpi jobs");
	Output::newline(); Output::print("         -display   Set the level of runtime output to show");
	Output::newline(); Output::print("            -time   Print the time to complete a single call to mint");
	Output::newline(); Output::print("       -tolerance   Set the maximum cartesian distance for values to be equal");
	Output::newline(); Output::print("           -print   Control format and location of writing structures");
	Output::newline(); Output::print("            -name   Change the file name to which a structure is written");
	Output::newline(); Output::print("             -fix   Fix cell parameters and positions that are defined");
	Output::newline(); Output::print("          -remove   Remove atoms from the structure");
	Output::newline(); Output::print("       -neighbors   Print nearest neighbors lists for atoms in the structure");
	Output::newline(); Output::print("           -shell   Print nearest neighbor shells for atoms in the structure");
	Output::newline(); Output::print("       -transform   Apply a transformation matrix to convert between unit cells");
	Output::newline(); Output::print("          -rotate   Rotate all positions of atoms with fixed unit cell vectors");
	Output::newline(); Output::print("           -shift   Shift all positions of atoms by a set amount");
	Output::newline(); Output::print("         -reduced   Convert the current cell to its Niggli-reduced form");
	Output::newline(); Output::print("       -primitive   Convert the current cell to a primitive one");
	Output::newline(); Output::print("    -conventional   Convert the current cell to its conventional form");
	Output::newline(); Output::print("           -ideal   Convert to an \"ideal\" form of the current cell");
	Output::newline(); Output::print("        -symmetry   Print the symmetry of the current unit cell");
	Output::newline(); Output::print("           -point   Get point group of structure or print about point groups");
	Output::newline(); Output::print("           -space   Get space group of structure or print about space groups");
	Output::newline(); Output::print("           -about   Print listed information about the structure or atoms in it");
	Output::newline(); Output::print("          -refine   Adjust cell to satisfy symmetry to numerical precision");
	Output::newline(); Output::print("         -perturb   Randomly adjust unit cell parameters or positions");
	Output::newline(); Output::print("          -unique   Print unique atoms, groups of atoms, or jumps between atoms");
	Output::newline(); Output::print("      -equivalent   Same as -unique but prints all atoms/groups/jumps");
	Output::newline(); Output::print("    -interstitial   Generate interstitial sites in the structure");
	Output::newline(); Output::print("          -energy   Calculate energy of the structure under supplied potential");
	Output::newline(); Output::print("          -forces   Calculate forces on all atoms under supplied potential");
	Output::newline(); Output::print("     -diffraction   Calculate diffraction patterns and R factors");
	Output::newline(); Output::print("        -optimize   Global optimization of the structure to minimize energy");
	Output::newline(); Output::print("         -compare   Compare two structures to determine if they are similar");
	Output::newline(); Output::print("             -kmc   Run kinetic Monte Carlo (KMC) diffusion simulation");
	
	// Print functions
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -help");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Print help information.");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -n / -np");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the number of processors to use when launching an external mpi");
	Output::newline(); Output::print("    job. This is only used if the launching function (MPIRUN in the makefile)");
	Output::newline(); Output::print("    contains -n or -np. Otherwise it is ignored since the launching function");
	Output::newline(); Output::print("    determines the number of available processors on its own.");
	Output::newline();
	Output::newline(); Output::print("Arguments: Any integer number to set the number of processors to use");
	Output::newline();
	Output::newline(); Output::print("Default: 1");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-np 2\" to launch external mpi programs on 2 processors");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -display / -output");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the level of runtime display to show. Level 1 is the most broad");
	Output::newline(); Output::print("    while the detail increases with level. This controls ordinary output only; ");
	Output::newline(); Output::print("    warnings and errors are always printed.");
	Output::newline();
	Output::newline(); Output::print("Arguments: Any integer number to set the max level that is displayed (0 is off)");
	Output::newline(); Output::print("    \"all\" or \"everything\" to show all output");
	Output::newline(); Output::print("    \"none\", \"nothing\", or \"off\" to show no output");
	Output::newline();
	Output::newline(); Output::print("Default: All runtime display is shown");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-display 3\"   show the first three levels of runtime output");
	Output::newline(); Output::print("    \"-display off\" show no output (except warnings/errors)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -time");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Show the total time to complete all functions.");
	Output::newline();
	Output::newline(); Output::print("Arguments: Any integer number sets the number of places to show after decimal");
	Output::newline(); Output::print("    \"seconds\" to print as seconds only, not hours/minutes/seconds");
	Output::newline();
	Output::newline(); Output::print("Default: four places after the decimal");
	Output::newline(); Output::print("    Time is formatted into hours/minutes/seconds");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-time\"     print the time to finish the run");
	Output::newline(); Output::print("    \"-time 2\"   print the time with two places after decimal");
	Output::newline(); Output::print("    \"-time sec\" print, for example, 90 seconds, not 1 minute, 30 seconds");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -tolerance");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the absolute tolerance used during comparisons between positions");
	Output::newline(); Output::print("    and distances. For a tolerance _tol, two positions are taken as equal if");
	Output::newline(); Output::print("    the distance between them, _dist, satisfies _dist <= _tol. This tolerance");
	Output::newline(); Output::print("    is used in many functions, such as those for determining symmetries.");
	Output::newline();
	Output::newline(); Output::print("Arguments: Any number (units: angstroms)");
	Output::newline();
	Output::newline(); Output::print("Default: 1e-4");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-tolerance 1e-2\" set the tolerance to 1e-2 angstroms");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -print / -write");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Controls where structures are printed and their format. If some");
	Output::newline(); Output::print("    positions or the lattice vectors are not defined, then they will be");
	Output::newline(); Output::print("    assigned random values; this can be turned off when printing to the mint");
	Output::newline(); Output::print("    format by passing \"free\" as an argument.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"fractional\" or \"direct\" to print using fractional coordinates");
	Output::newline(); Output::print("    \"cartesian\" to print to cartesian coordinates if available in set format");
	Output::newline(); Output::print("    \"screen\" or \"stdout\" to print to standard out instead of a file");
	Output::newline(); Output::print("    \"mint\" or \".mint\" for mint format");
	Output::newline(); Output::print("    \"vasp\", \"vasp5\", \"vasp 5\", \".vasp\", or \".vasp5\" for vasp 5 format");
	Output::newline(); Output::print("    \"vasp 4\", \"vasp4\", or \".vasp4\" for vasp 4 format");
	Output::newline(); Output::print("    \"cif\" or \".cif\" for cif format");
	Output::newline(); Output::print("    \"crystalmaker\", \"cm\", \"cmtx\", or \".cmtx\" for crystal maker format");
	Output::newline(); Output::print("    \"findsym\", \".findsym\", \"fs\", or \".fs\" for findsym format");
	Output::newline(); Output::print("    \"quantum\", \"espresso\", \"qe\", or \".qe\" for quantum espresso format");
	Output::newline(); Output::print("    \"free\" prevent atoms/basis from being randomly set (only for mint format)");
	Output::newline();
	Output::newline(); Output::print("Default: structures are printed to a file in the same format as the original");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-print screen\"         print to standard out");
	Output::newline(); Output::print("    \"-print vasp\"           print to vasp format");
	Output::newline(); Output::print("    \"-print vasp cartesian\" print to vasp format in cartesian coordinates");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -name");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Change the file name for writing a structure.");
	Output::newline();
	Output::newline(); Output::print("Arguments: Any valid file name");
	Output::newline();
	Output::newline(); Output::print("Default: Same file name as the original. If the setting \"overwrite\" is set to");
	Output::newline(); Output::print("    false, then a number may be appended to the file name (i.e. name_1) in ");
	Output::newline(); Output::print("    order to avoid writing over an existing file. If this setting is true, ");
	Output::newline(); Output::print("    then overwrites will be allowed.");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-name newname\" print structure to a file named newname");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -remove");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Remove atoms from the structure by element type, index, or position.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    Integer to remove atom with that index");
	Output::newline(); Output::print("    Element to remove all atoms of set element");
	Output::newline(); Output::print("    Element and integer to remove instance of set element");
	Output::newline(); Output::print("    Three decimal values to remove atom at set position");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-rem 1 2\"         remove atoms 1 and 2");
	Output::newline(); Output::print("    \"-rem Al\"          remove all Al atoms");
	Output::newline(); Output::print("    \"-rem Al 2 H 3\"    remove second Al and third H atoms");
	Output::newline(); Output::print("    \"-rem 0.5 0.0 0.0\" remove atom at 0.5, 0.0, 0.0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -fix");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Fix atomic coordinates and lattice parameters that have been");
	Output::newline(); Output::print("    explicitly defined for the structure and are not already fixed. Any");
	Output::newline(); Output::print("    positions or parameters that were not set will still be allowed to change.");
	Output::newline(); Output::print("    This is useful when importing a structure that is to be optimized but for");
	Output::newline(); Output::print("    which some properties are known; in this case, the properties that are");
	Output::newline(); Output::print("    fixed by this command will not be changed.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"atoms\" or \"positions\" to fix positions");
	Output::newline(); Output::print("    \"basis\" or \"lattice\" to fix lattice parameters");
	Output::newline();
	Output::newline(); Output::print("Default: Without arguments, known positions and lattice parameters are fixed");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-fix\"       fix all positions and lattice parameters that are defined");
	Output::newline(); Output::print("    \"-fix atoms\" fix all positions that are defined, basis is still free");
	Output::newline(); Output::print("    \"-fix basis\" fix lattice parameters, all positions are still free");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -neighbors");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Calculate nearest neighbors list. For each atom, the distance in");
	Output::newline(); Output::print("    angstroms is printed as well as three integers that give the cell in which");
	Output::newline(); Output::print("    the nearest image of the atom occurs.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    No arguments to print neighbors list for all atoms");
	Output::newline(); Output::print("    Integer to print neighbors to atom with that index");
	Output::newline(); Output::print("    Element to print neighbors to all atoms of set element");
	Output::newline(); Output::print("    Element and integer to print neighbors to instance of set element");
	Output::newline(); Output::print("    Three decimal values to print neighbors to atom at set position");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-neigh\"             print neighbors list for all atoms");
	Output::newline(); Output::print("    \"-neigh 1 2\"         print neighbors for atoms 1 and 2");
	Output::newline(); Output::print("    \"-neigh Al\"          print neighbors for all Al atoms");
	Output::newline(); Output::print("    \"-neigh Al 2 H 3\"    print neighbors for second Al and third H atoms");
	Output::newline(); Output::print("    \"-neigh 0.5 0.0 0.0\" print neighbors for atom at 0.5, 0.0, 0.0");
	
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -shell");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Calculate nearest neighbor shells. Given a particular atom, A0, in the");
	Output::newline(); Output::print("    structure, all other other atoms (including periodic images) out to a set");
	Output::newline(); Output::print("    maximum are grouped by distance from A0. When grouping atoms into shells,");
	Output::newline(); Output::print("    two distances are considered the same if the difference between them is");
	Output::newline(); Output::print("    less than some tolerance; this can be changed using the -tol command or the");
	Output::newline(); Output::print("    \"tolerance\" tag in a settings file.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"details\" to print information about each atom in the shell");
	Output::newline(); Output::print("    No arguments to print shells for all atoms");
	Output::newline(); Output::print("    Integer to print shells of atom with that index");
	Output::newline(); Output::print("    Element to print shells of all atoms of set element");
	Output::newline(); Output::print("    Element and integer to print shells of instance of set element");
	Output::newline(); Output::print("    Decimal value to set the max distance to calculate shells");
	Output::newline();
	Output::newline(); Output::print("Default: Default max distance is 3 Ang");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-shell\"             print shells for all atoms");
	Output::newline(); Output::print("    \"-shell 1 2\"         print shells for atoms 1 and 2");
	Output::newline(); Output::print("    \"-shell Al\"          print shells for all Al atoms");
	Output::newline(); Output::print("    \"-shell Al 2 H 3\"    print shells for second Al and third H atoms");
	Output::newline(); Output::print("    \"-shell 5.0\"         print shells out to 5 Ang");
	Output::newline(); Output::print("    \"-shell det\"         print shells and information about each member atom");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -transform");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Transform a cell. The new lattice vectors are equal to Lnew = M*Lorig");
	Output::newline(); Output::print("    where M is the transformation matrix and Lorig is the original matrix of");
	Output::newline(); Output::print("    lattice vectors (each vector along a row of the matrix).");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    Three numbers (n1 to n3) to set the transformation matrix");
	Output::newline(); Output::print("            | n1  0  0 |");
	Output::newline(); Output::print("        M = | 0  n2  0 |");
	Output::newline(); Output::print("            | 0   0 n3 |");
	Output::newline(); Output::print("    Nine numbers (n1 to n9) to set the transformation matrix");
	Output::newline(); Output::print("            | n1 n2 n3 |");
	Output::newline(); Output::print("        M = | n4 n5 n6 |");
	Output::newline(); Output::print("            | n7 n8 n9 |");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-transform 2 1 2\"             transform with 2, 1, 2 on matrix diagonal");
	Output::newline(); Output::print("    \"-transform 1 1 1 0 1 1 0 0 1\" transform with corresponding matrix");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -rotate");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Rotate fractional positions of atoms in the cell. For a rotation");
	Output::newline(); Output::print("    matrix R, the position of an atom after rotation is R*x0 where x0 is its");
	Output::newline(); Output::print("    original position.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    Nine numbers (r1 to r9) to set the rotation matrix");
	Output::newline(); Output::print("            | r1 r2 r3 |");
	Output::newline(); Output::print("        R = | r4 r5 r6 |");
	Output::newline(); Output::print("            | r7 r8 r9 |");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-rotate 1 1 0 1 0 0 0 0 1\" rotate positions with corresponding matrix");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -shift");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Shift atom positions by a set amount.");
	Output::newline();
	Output::newline(); Output::print("Arguments: (all numbers are given as fractions of lattice vectors)");
	Output::newline(); Output::print("    One number (n) to shift by the vector n, n, n");
	Output::newline(); Output::print("    Three numbers (n1 to n3) to shift by the vector n1, n2, n3");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-shift 0.5\"     shift positions by the vector 0.5, 0.5, 0.5");
	Output::newline(); Output::print("    \"-shift 0.5 0 0\" shift positions by the vector 0.5, 0.0, 0.0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -reduced");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Perform Niggli reduction of current cell. Note that this DOES NOT");
	Output::newline(); Output::print("    convert to the primitive cell first; for a reduced primitive cell, run");
	Output::newline(); Output::print("    -primitive -reduced.");
	Output::newline();
	Output::newline(); Output::print("Arguments: none");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -primitive");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Convert to the primitive form of the current cell. Note that the");
	Output::newline(); Output::print("    primitive cell is not unique; a unique primitive cell can be obtained by");
	Output::newline(); Output::print("    reducing (-reduced) the primitive cell.");
	Output::newline();
	Output::newline(); Output::print("Arguments: none");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -conventional");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Convert current structure to conventional cell. The space group of the");
	Output::newline(); Output::print("    structure is first determined and the appropriate transformation and origin");
	Output::newline(); Output::print("    shift are applied to convert the structure so that the symmetry operations");
	Output::newline(); Output::print("    agree with those in the International Tables of Crystallography.");
	Output::newline();
	Output::newline(); Output::print("Arguments: none");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -ideal");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Convert current structure to its most ideal form. The most ideal form");
	Output::newline(); Output::print("    is defined as the unit cell that maximizes the minimum image distance under");
	Output::newline(); Output::print("    periodic boundary conditions while preserving a set number of atoms or,");
	Output::newline(); Output::print("    equivalently, a set volume. The transformation that is found also ensures");
	Output::newline(); Output::print("    that all rotational symmetry operation elements are integer. This last");
	Output::newline(); Output::print("    requirement can significantly restrict the cell shapes that are allowed");
	Output::newline(); Output::print("    for high-symmetry structures, which may lead to cell sizes that are very");
	Output::newline(); Output::print("    different than what is targeted.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    None to convert current cell to its most ideal form without changing size");
	Output::newline(); Output::print("    Integer number to set the minimum number of atoms in the ideal cell");
	Output::newline(); Output::print("    \"max\" or \"most\" to change to setting the maximum number of atoms");
	Output::newline(); Output::print("    \"dis\" and a number (Ang) to set ideal cell by the minimum image distance");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-ideal\"         to convert to ideal cell without changing size");
	Output::newline(); Output::print("    \"-ideal 100\"     to convert to ideal cell with at least 100 atoms");
	Output::newline(); Output::print("    \"-ideal max 100\" to convert to ideal cell with at most 100 atoms");
	Output::newline(); Output::print("    \"-ideal dis 12\"  to convert to cell with minimum image distance of 12 Ang");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -symmetry");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Print the symmetry of the current unit cell. A list of unique symmetry");
	Output::newline(); Output::print("    operations are printed first; there should be as many operations in this");
	Output::newline(); Output::print("    list as there are operations in the primitive cell of the structure. A");
	Output::newline(); Output::print("    second list is printed of centering vectors. For a primitive cell, this");
	Output::newline(); Output::print("    will simply contain 0, 0, 0, but can contain more entries for non-primitive");
	Output::newline(); Output::print("    cells. Each centering vector can be added to any of the unique symmetry");
	Output::newline(); Output::print("    operations so that in total there are Nsym*Ncent symmetry operations in the");
	Output::newline(); Output::print("    unit cell where Nsym is the number of unique operations and Ncent is the");
	Output::newline(); Output::print("    number of centering vectors. Note that these symmetries apply the current");
	Output::newline(); Output::print("    cell, which may not necessarily be the conventional one. To obtain the");
	Output::newline(); Output::print("    conventional cell symmetry, run -conventional -symmetry.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"matrix\" to print operations in matrix form");
	Output::newline();
	Output::newline(); Output::print("Defaults: Without arguments operations are printed in Jones-Faithful notation");
	Output::newline();
	Output::newline(); Output::print("Expample:");
	Output::newline(); Output::print("    \"-symmetry\"        to print operations in Jones-Faithful notation");
	Output::newline(); Output::print("    \"-symmetry matrix\" to print operations in matrix form");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -point");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Print the point group of the structure, a list of all point groups,");
	Output::newline(); Output::print("    or information about a point group.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    No arguments and no supplied structure to print a list of all point groups");
	Output::newline(); Output::print("    No arguments and a structure to print the point group of the structure");
	Output::newline(); Output::print("    Point group name (no spaces) for information about that point group");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"mint -point\"               print a list of all point groups");
	Output::newline(); Output::print("    \"mint structureFile -point\" get point group of structure in structureFile");
	Output::newline(); Output::print("    \"mint -point mmm 6\"         get information about point groups mmm and 6");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -space");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Print the space group of the structure, a list of all space groups,");
	Output::newline(); Output::print("    or information about a space group.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    No arguments and no supplied structure to print a list of all space groups");
	Output::newline(); Output::print("    No arguments and a structure to print the space group of the structure");
	Output::newline(); Output::print("    Space group name (no spaces) for information about that space group");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"mint -space\"               print a list of all space groups");
	Output::newline(); Output::print("    \"mint structureFile -space\" get space group of structure in structureFile");
	Output::newline(); Output::print("    \"mint -space P3 C2\"         get information about space groups P3 and C2");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -about");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Print the following information about the structure:");
	Output::newline(); Output::print("      * Point group");
	Output::newline(); Output::print("      * Space group");
	Output::newline(); Output::print("      * Unit cell volume");
	Output::newline(); Output::print("      * Unit cell basis vectors");
	Output::newline(); Output::print("      * Unit cell lengths and angles");
	Output::newline(); Output::print("      * Symmetry operations");
	Output::newline(); Output::print("      * All atomic positions grouped by equivalence under structure symmetry");
	Output::newline();
	Output::newline(); Output::print("    If the keyword \"atom\" is passed, then the following information for each");
	Output::newline(); Output::print("    selected atom is printed:");
	Output::newline(); Output::print("      * Atom number and element");
	Output::newline(); Output::print("      * Fractional and cartesian coordinates");
	Output::newline(); Output::print("      * Site symmetry operations");
	Output::newline(); Output::print("      * List of atoms in the same orbit");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    No arguments to print information about the structure");
	Output::newline(); Output::print("    \"atom\" to print information about selected atoms");
	Output::newline(); Output::print("    Integer to print information about atom with that index");
	Output::newline(); Output::print("    Element to print information about all atoms of set element");
	Output::newline(); Output::print("    Element and integer to print information about instance of set element");
	Output::newline(); Output::print("    Three decimal values to print information about atom at set position");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-about\"                  print information about the structure");
	Output::newline(); Output::print("    \"-about atom 1 2\"         print information about atoms 1 and 2");
	Output::newline(); Output::print("    \"-about atom Al\"          print information about all Al atoms");
	Output::newline(); Output::print("    \"-about atom Al 2 H 3\"    print information about 2nd Al and 3rd H atoms");
	Output::newline(); Output::print("    \"-about atom 0.5 0.0 0.0\" print information about atom at 0.5, 0.0, 0.0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -refine");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Refine the lattice vectors and atomic positions so that a set of");
	Output::newline(); Output::print("    symmetry operations that are satisfied only to some tolerance are made");
	Output::newline(); Output::print("    exact. A wide tolerance (e.g. 0.1 angstroms or higher, set with -tolerance)");
	Output::newline(); Output::print("    may be needed for structures that are slightly disordered. Once the");
	Output::newline(); Output::print("    symmetry has been determined, the lattice vectors are refined to preserve");
	Output::newline(); Output::print("    the lattice symmetry that is found (e.g. cubic, tetragonal, etc.). Atomic");
	Output::newline(); Output::print("    positions are refined essentially by averaging over sites that are");
	Output::newline(); Output::print("    equivalent to one another under these symmetries.");
	Output::newline();
	Output::newline(); Output::print("    If a diffraction pattern has been supplied as input, the refinement");
	Output::newline(); Output::print("    has a different purpose. In this case, the atomic coordinates are relaxed");
	Output::newline(); Output::print("    so as to minimize the difference between the calculated and supplied");
	Output::newline(); Output::print("    patterns.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"atoms\" or \"positions\" to refine positions only");
	Output::newline(); Output::print("    \"basis\" or \"lattice\" to refine lattice parameters only");
	Output::newline();
	Output::newline(); Output::print("Default: Without arguments, positions and lattice parameters are both refined");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-refine\"       refine atomic positions and lattice vectors");
	Output::newline(); Output::print("    \"-refine atoms\" refine atomic positions only");
	Output::newline(); Output::print("    \"-refine basis\" refine lattice vectors only");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -perturb");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Randomly adjust the atomic positions and/or lattice vectors.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    One number to perturb by this amount in random direction (units: angstroms)");
	Output::newline(); Output::print("    Two numbers for random amount within their range (units: angstroms)");
	Output::newline(); Output::print("    \"basis\" or \"lattice\" to perturb lattice vectors only");
	Output::newline(); Output::print("    \"atoms\", \"coordinates\", or \"positions\" to perturb positions only");
	Output::newline(); Output::print("    \"symmetry\" to preserve any symmetries that exist in the structure");
	Output::newline();
	Output::newline(); Output::print("Defaults: displacement amount of 0.25 angstroms");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-perturb\"          perturb atoms and basis vectors by default");
	Output::newline(); Output::print("    \"-perturb atoms\"    perturb atoms only");
	Output::newline(); Output::print("    \"-perturb basis\"    perturb lattice vectors only");
	Output::newline(); Output::print("    \"-perturb 0.1\"      perturb atoms and basis by 0.1 angstroms");
	Output::newline(); Output::print("    \"-perturb 0.1 0.2\"  perturb atoms and basis randomly 0.1 to 0.2 angstroms");
	Output::newline(); Output::print("    \"-perturb symmetry\" make perturbations while maintaining cell symmetry");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -unique / -equivalent");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Search for unique atoms, groups of atoms, or transitions between atomic");
	Output::newline(); Output::print("    sites in a structure. -unique prints only the unique groups that are found.");
	Output::newline(); Output::print("    -equivalent prints the unique groups and all equivalent groups for each.");
	Output::newline(); Output::print("    If searching for unique atoms or groups (not transitions), a copy is made");
	Output::newline(); Output::print("    of the structure for each unique group and the corresponding atoms are");
	Output::newline(); Output::print("    removed to make a vacancy. For transitions, no distance is needed but a");
	Output::newline(); Output::print("    max distance can be supplied. The program will use several criteria to");
	Output::newline(); Output::print("    determine those jumps that are likely the most important, but none of them");
	Output::newline(); Output::print("    will be larger than this max distance.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    List of elements in the group");
	Output::newline(); Output::print("    Number to set the distance from the first atom when searching for groups");
	Output::newline(); Output::print("    \"Jumps\" to search for jumps between sites");
	Output::newline(); Output::print("    \"Interstitial\" to search for atoms that are marked as interstitials");
	Output::newline();
	Output::newline(); Output::print("Defaults:");
	Output::newline(); Output::print("    Distance from first atom for a group is 2 Ang");
	Output::newline(); Output::print("    Max distance for a jump is 7 Ang");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-unique Al\"       find all unique Al atoms in a structure");
	Output::newline(); Output::print("    \"-equiv Al\"        find unique Al atoms all equivalent atoms to each");
	Output::newline(); Output::print("    \"-unique Al H 2\"   find all Al-H pairs within 2 ang");
	Output::newline(); Output::print("    \"-unique Al H H 2\" find Al-H-H with neither H more than 2 ang from Al");
	Output::newline(); Output::print("    \"-unique Al jumps\" find all jumps between Al sites");
	Output::newline(); Output::print("    \"-unique Al int\"   find all unique Al atoms marked as interstitials");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -interstitial");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Search for interstitial sites in a structure. This algorithm works by");
	Output::newline(); Output::print("    placing an exponential decay (Exp[-r/a]) at each atomic site and searching");
	Output::newline(); Output::print("    for minima in the resulting function. For each unique site that is found, a");
	Output::newline(); Output::print("    copy of the structure is made and an atom of the set element is placed at");
	Output::newline(); Output::print("    one of the sites. These structures can be printed by specifying the -print");
	Output::newline(); Output::print("    command. These sites are purely geometric and should be refined using a");
	Output::newline(); Output::print("    more accurate metric (e.g. pair potential or DFT).");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    Element (symbol or name) to set the element to place at unique sites");
	Output::newline(); Output::print("    Integer to set number of start points (per atom) when searching for minima");
	Output::newline(); Output::print("    Float to set decay rate for exponentials (a in Exp[-r/a])");
	Output::newline(); Output::print("    \"Expand\" to generate all symmetrically equivalent sites");
	Output::newline();
	Output::newline(); Output::print("Defaults:");
	Output::newline(); Output::print("    Hydrogen is placed at unique sites");
	Output::newline(); Output::print("    25 starting points per atom");
	Output::newline(); Output::print("    Decay rate of 0.25");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"-int\"           search for interstitial sites");
	Output::newline(); Output::print("    \"-int expand\"    search for interstitial sites and populate all equivalent");
	Output::newline(); Output::print("    \"-int Li\"        place Li at interstitial sites");
	Output::newline(); Output::print("    \"-int 50\"        search for interstitial sites with 50 starting points");
	Output::newline(); Output::print("    \"-int 0.2\"       search for interstitial sites with decay rate of 0.2");
	Output::newline(); Output::print("    \"-int 0.2 Li 50\" previous three examples combined");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -energy");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Calculate the energy of a structure under a supplied potential. Both");
	Output::newline(); Output::print("    the total energy of the unit cell and the energy per atom are returned.");
	Output::newline();
	Output::newline(); Output::print("Arguments: none");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -forces");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Calculate the forces on atoms in a structure under a supplied");
	Output::newline(); Output::print("    potential.");
	Output::newline();
	Output::newline(); Output::print("Arguments: none");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -diffraction");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Calculate the powder xray diffraction pattern for a structure. If a");
	Output::newline(); Output::print("    diffraction pattern was supplied as input, the r-factor will be calculated");
	Output::newline(); Output::print("    by optimizing the scaling between calculated and reference patterns, as well");
	Output::newline(); Output::print("    as the atomic displacement factors for the atoms in the structure (see");
	Output::newline(); Output::print("    -refine to optimize atomic positions).");
	Output::newline();
	Output::newline(); Output::print("Arguments: additional xray patterns to compare to reference");
	Output::newline(); Output::print("    \"broaden\" to print a broadened diffraction pattern");
	Output::newline(); Output::print("    \"wavelength\" and number to set the xray wavelength");
	Output::newline(); Output::print("    \"fwhm\" and number to set the FWHM for broadening (or use variance)");
	Output::newline(); Output::print("    \"variance\" and number to set the variance for broadending (or use fwhm)");
	Output::newline(); Output::print("    \"resolution\" and number to set resolution for printing broadened points");
	Output::newline(); Output::print("    \"minimum\" and number to set the minimum two-theta value to calculate");
	Output::newline(); Output::print("    \"maximum\" and number to set the maximum two-theta value to calculate");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"mint str -xray\"        get diffraction pattern for structure in str");
	Output::newline(); Output::print("    \"mint x.in str -xray\"   get diffraction pattern and compare to x.in");
	Output::newline(); Output::print("    \"mint x.in -xray x2.in\" compare patterns in x.in and x2.in");
	Output::newline(); Output::print("    \"-xray broaden\"         print a broadened pattern");
	Output::newline(); Output::print("    \"-xray wave 1.5\"        set the xray wavelength to 1.5 Ang");
	Output::newline(); Output::print("    \"-xray fwhm 0.5\"        set the fwhm to 0.5 deg for broadending");
	Output::newline(); Output::print("    \"-xray res 0.05\"        print a point every 0.05 deg when broadending");
	Output::newline(); Output::print("    \"-xray min 10\"          calculate intensities starting at 2theta of 10");
	Output::newline(); Output::print("    \"-xray max 100\"         calculate intensities up to 2theta of 100");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -optimize");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Run global optimization for a structure. Any free parameters will be");
	Output::newline(); Output::print("    changed while any that are fixed will be preserved. Multiple optimization");
	Output::newline(); Output::print("    metrics can be supplied, and all will be used to rank structures during");
	Output::newline(); Output::print("    crossover operations, but only one of these metrics is used to determine");
	Output::newline(); Output::print("    which structure is the \"best\" one. For example, if a potential energy");
	Output::newline(); Output::print("    function and reference x-ray pattern are both supplied, but the energy is");
	Output::newline(); Output::print("    set as the metric to optimize, then both metrics are used to rank structures");
	Output::newline(); Output::print("    during crossover, but the structure with the overall lowest energy is taken");
	Output::newline(); Output::print("    as the \"best\" structure.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"energy\" or \"potential\" to optimize the energy");
	Output::newline(); Output::print("    \"xray\" or \"diffraction\" to optimize the r-factor");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline();  Output::print("    \"mint str xray.in -opt\"             optimize r-factor");
	Output::newline();  Output::print("    \"mint str pot.in -opt\"              optimize energy");
	Output::newline();  Output::print("    \"mint str xray.in pot.in -opt xray\" optimize r-factor, bias with energy");
	Output::newline();  Output::print("    \"mint str xray.in pot.in -opt pot\"  optimize energy, bias with r-factor");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -compare");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Compare structures to determine if they are cells derived from the");
	Output::newline(); Output::print("    same lattice. Comparisons are made in the following ways:");
	Output::newline();
	Output::newline(); Output::print("        Test 1: Are elements the same in both structures?");
	Output::newline(); Output::print("        Action: Convert both cells to primitive form");
	Output::newline(); Output::print("        Test 2: Are the number of atoms of each element the same in both");
	Output::newline(); Output::print("                primitive cells?");
	Output::newline(); Output::print("        Test 3: (optional) Are the primitive cell volumes the same?");
	Output::newline(); Output::print("        Action: Convert both primitive cells to reduced form");
	Output::newline(); Output::print("        Test 4: (optional) Are the internal angles of both reduced cells the"); 
	Output::newline(); Output::print("                same? If not, convert reduced cell two from all acute angles");
	Output::newline(); Output::print("                to all obtuse angles (or vice versa) and compare angles again.");
	Output::newline(); Output::print("        Test 5: (optional) Are all ratios of reduced cell vector lengths the");
	Output::newline(); Output::print("                same? eg Is it true that a1/b1 = a2/b2 where a1 is the length");
	Output::newline(); Output::print("                of the a lattice vector in reduced cell 1?");
	Output::newline(); Output::print("        Test 6: Is there a rotation and translation that when applied to");
	Output::newline(); Output::print("                reduced cell 2, maps the positions onto those of reduced");
	Output::newline(); Output::print("                cell 1? Possible rotations are determined using a modified");
	Output::newline(); Output::print("                version of the Le Page algorithm to determine lattice symmetry.");
	Output::newline();
	Output::newline(); Output::print("    Two structures are considered the same only if they pass all tests. It may");
	Output::newline(); Output::print("    be necessary to increase the tolerance (-tol) to identify similar structures");
	Output::newline(); Output::print("    that are slightly different.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    \"volume\" to compare the volumes of the primitive cells");
	Output::newline(); Output::print("    \"cell\"   to turn off comparison of cell parameters");
	Output::newline();
	Output::newline(); Output::print("Default: Volumes are not compared and cell parameters are compared");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    \"mint str1 str2 -compare\"      compare structures in str1 and str2");
	Output::newline(); Output::print("    \"mint str1 str2 -compare vol\"  compare structures + volume in str1 and str2");
	Output::newline(); Output::print("    \"mint str1 str2 -compare cell\" compare structures except cell parameters");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" -kmc");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Run lattice-based kinetic Monte Carlo (KMC) simulation of atomic");
	Output::newline(); Output::print("    diffusion. These simulations are initialized over two steps and run in");
	Output::newline(); Output::print("    a third. In the first step, the sub-lattice on which diffusion occurs is");
	Output::newline(); Output::print("    defined and the user performs relaxations of defects at symmetrically");
	Output::newline(); Output::print("    unique sites. In the second step, a network of jumps between sites in the");
	Output::newline(); Output::print("    structure is generated and the user calculates the energy along each path.");
	Output::newline(); Output::print("    In the final step, the KMC simulation is performed and the diffusivity");
	Output::newline(); Output::print("    prefactor and activation energy are calculated assuming Arrhenius behavior");
	Output::newline(); Output::print("    of the diffusivity.");
	Output::newline();
	Output::newline(); Output::print("    In the first step, the user supplies a structure and declares on which");
	Output::newline(); Output::print("    sub-lattice diffusion takes place. The program will then print a file called");
	Output::newline(); Output::print("    \"kmc.setup\" and a series of directories. The first several lines of this");
	Output::newline(); Output::print("    file will begin with the word \"SITE\". Each site corresponds to one of the");
	Output::newline(); Output::print("    directories than was created. The user should fully relax the structures in");
	Output::newline(); Output::print("    each of these directories. Then edit the kmc.setup file so that each site");
	Output::newline(); Output::print("    line points to these unrelaxed and relaxed structures.");
	Output::newline();
	Output::newline(); Output::print("    In the second step, the user supplies their modified kmc.setup file and the");
	Output::newline(); Output::print("    program generates a second file, \"kmc.in\", and another set of directories.");
	Output::newline(); Output::print("    Following the \"SITE\" lines in kmc.in are a series of lines that begin with");
	Output::newline(); Output::print("    \"JUMP\". Each jump line corresponds to one of the directories that was");
	Output::newline(); Output::print("    printed in this step. Each of the jump directories contains two files:");
	Output::newline(); Output::print("    \"initial\" and \"final\". The user should find the energetic barrier");
	Output::newline(); Output::print("    between these two structures (for example using NEB calculations). The user");
	Output::newline(); Output::print("    should then modify the kmc.in file. On each \"SITE\" line, the user enters");
	Output::newline(); Output::print("    the formation energy of the defect at that particular site, the total energy");
	Output::newline(); Output::print("    of the structure, and, optionally, the name of a file containing phonon");
	Output::newline(); Output::print("    frequencies for this structure. On each \"JUMP\" line, the user should enter");
	Output::newline(); Output::print("    the total energy of the structure in its transition state along this jump");
	Output::newline(); Output::print("    and, optionally, the name of a file containing phonon frequencies of the");
	Output::newline(); Output::print("    structure in its transition state.");
	Output::newline();
	Output::newline(); Output::print("    In the final step, the user supplies their modified kmc.in file and the");
	Output::newline(); Output::print("    program runs the KMC simulation. Simulations are performed at a series of");
	Output::newline(); Output::print("    temperatures and a fit of the Arrhenius equation (D = D0*exp[-Q/kt]) is");
	Output::newline(); Output::print("    applied to the resulting diffusivities; the values of the pre-exponential");
	Output::newline(); Output::print("    factor, D0, and the activation energy, Q, are printed to standard out.");
	Output::newline(); Output::print("    Diffusivities from each simulation are printed to files.");
	Output::newline();
	Output::newline(); Output::print("    In order to run diffusion for interstitial atoms, the initial structure in");
	Output::newline(); Output::print("    step 1 must be given in mint structure format, with the interstitial sites");
	Output::newline(); Output::print("    labeled as such.");
	Output::newline();
	Output::newline(); Output::print("Arguments:");
	Output::newline(); Output::print("    Step 1: Element to specify the sub-lattice on which diffusion is calculated");
	Output::newline(); Output::print("            \"interstitial\" to specify that diffusion is on intersitial sites");
	Output::newline(); Output::print("            One of the formats in \"-print\" to set the output file format");
	Output::newline(); Output::print("    Step 2: None");
	Output::newline(); Output::print("    Step 3: None");
	Output::newline();
	Output::newline(); Output::print("Default:");
	Output::newline(); Output::print("    Step 1: Diffusion is on parent structure sites (ie not interstitials)");
	Output::newline(); Output::print("            Structures are printed in the same format as the input one");
	Output::newline(); Output::print("    Step 2: N/A");
	Output::newline(); Output::print("    Step 3: N/A");
	Output::newline();
	Output::newline(); Output::print("Examples:");
	Output::newline(); Output::print("    Step 1: \"mint str -kmc Al\"      Set up self-diffusion on Al sites");
	Output::newline(); Output::print("            \"mint str -kmc Al int\"  Set up diffusion on interstitial Al sites");
	Output::newline(); Output::print("            \"mint str -kmc Al vasp\" Print all structure files in vasp format");
	Output::newline(); Output::print("    Step 2: \"mint kmc.setup -kmc\"   Generate kmc.in file from kmc.setup");
	Output::newline(); Output::print("    Step 3: \"mint kmc.in -kmc\"      Perform kmc simulation using kmc.in");
	
	// Reset output method
	Output::method(origMethod);
}



/* void Help::settings()
 *
 * Print settings
 */

void Help::settings()
{
	
	// Set output method
	PrintMethod origMethod = Output::method();
	Output::method(STANDARD);
	
	// Print
	Output::newline(); Output::print("List of settings and brief descriptions (detailed descriptions follow):");
	Output::newline();
	Output::newline(); Output::print("         numprocs   Number of processors when launching external MPI programs");
	Output::newline(); Output::print("     displaylevel   Level of runtime output to display (0 is no output)");
	Output::newline(); Output::print("       displaytab   Indentation for each nested level of runtime output");
	Output::newline(); Output::print("         timeshow   Set whether the time to complete a run is printed");
	Output::newline(); Output::print("         timeprec   Number of decimal places to show when printing run time");
	Output::newline(); Output::print("       formattime   Control whether time is converted to minutes/seconds");
	Output::newline(); Output::print("        tolerance   Tolerance used to test floating point values for equality");
	Output::newline(); Output::print("       clustertol   Equality tolerance when expanding positions by symmetry");
	Output::newline(); Output::print("        usestdout   Structures are printed to stdout, instead of to a file");
	Output::newline(); Output::print("      coordinates   Print positions in fractional or cartesian coordinates");
	Output::newline(); Output::print("        strformat   Control the file format for printing structures");
	Output::newline(); Output::print("        overwrite   Allow structure files to be overwritten");
	Output::newline(); Output::print("     addextension   Add a file extension when printing a structure to file");
	Output::newline(); Output::print("  randstrmaxloops   Maximum number of loops when generating a random structure");
	Output::newline(); Output::print("   randstrminbond   Minimum random bond length");
	Output::newline(); Output::print("      gaoptnumsim   Number of unique runs during GA optimization");
	Output::newline(); Output::print("     gaoptpopsize   Number of structure in GA optimization");
	Output::newline(); Output::print(" gaoptcellmutprob   Probability of cell mutation in GA optimization");
	Output::newline(); Output::print("  gaoptposmutprob   Probability of position mutation in GA optimization");
	Output::newline(); Output::print(" gaoptwyckmutprob   Probability of Wyckoff site mutation in GA optimization");
	Output::newline(); Output::print("      gaoptmetric   Metric to optimize in GA-based optimization");
	Output::newline(); Output::print("    gaoptconverge   Number of GA generations without change for convergence");
	Output::newline(); Output::print("     gaoptmaxgens   Maximum number of GA generations allowed during optimization");
	Output::newline(); Output::print("   gaoptnumtokeep   Number of structures to keep between GA generations");
	Output::newline(); Output::print("   gaoptselection   Selection method to use during GA optimization");
	Output::newline(); Output::print("   gaoptenergytol   Tolerance for an energy to be a new best during GA");
	Output::newline(); Output::print("     gaoptdifftol   Tolerance for an r-factor to be a new best during GA");
	Output::newline(); Output::print("gaoptscreenmethod   Screening method used during GA optimization");
	Output::newline(); Output::print("   gaoptscreennum   Number of trial structures to screen during GA");
	Output::newline(); Output::print("      wyckoffbias   Biasing level for choosing random Wyckoff positions");
	Output::newline(); Output::print("      minimagedis   Minimum image distance when generating supercells");
	Output::newline(); Output::print("  maxjumpdistance   Maximum jump distance when generating jumps between sites");
	Output::newline(); Output::print("  kmcjumpsperatom   Number of jumps in a KMC simulation per atom");
	Output::newline(); Output::print("      kmcconverge   Convergence for a KMC simulation to be complete");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" numprocs");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Mint has the ability to launch external programs such as VASP and");
	Output::newline(); Output::print("    Quantum Espresso, which may be MPI-enabled. This setting controls the number");
	Output::newline(); Output::print("    of processors that are allocated to the external job. In this way, Mint can");
	Output::newline(); Output::print("    be launched on a single core, but still call external programs running on");
	Output::newline(); Output::print("    many processors. This setting can be controlled from the command line");
	Output::newline(); Output::print("    using the -n/-np function.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer");
	Output::newline();
	Output::newline(); Output::print("Default: 1");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" displaylevel");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: By default, no runtime output is shown, only results. However, there");
	Output::newline(); Output::print("    is a large amount of information that can be printed by increasing the");
	Output::newline(); Output::print("    value of this setting. Level 1 output is very general where higher levels");
	Output::newline(); Output::print("    become more specific. This setting can be controlled from the command line");
	Output::newline(); Output::print("    with the -display function.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" displaytab");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Each successive level of runtime output is indented by a set tab value.");
	Output::newline(); Output::print("    This setting controls the number of spaces that define this tab. This is a");
	Output::newline(); Output::print("    purely aesthetic setting.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 4");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" timeshow");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: The time to complete a single call to Mint can be displayed at the");
	Output::newline(); Output::print("    end if a run with this setting. This can also be controlled from the command");
	Output::newline(); Output::print("    line using the -time function.");
	Output::newline();
	Output::newline(); Output::print("Values: True (to show the time)");
	Output::newline(); Output::print("        False (not to show the time)");
	Output::newline();
	Output::newline(); Output::print("Default: False (time is not shown)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" timeprec");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Precision to use when printing the time to complete a run. This setting");
	Output::newline(); Output::print("    controls the number of places that are shown after the decimal. This can");
	Output::newline(); Output::print("    also be controlled from the command line using the -time function.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 4");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" formattime");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control whether time is printed as the total number of seconds to");
	Output::newline(); Output::print("    complete a single run, or formatted into days/hours/minutes/seconds.");
	Output::newline();
	Output::newline(); Output::print("Values: True (to convert to days/hours/minutes/seconds)");
	Output::newline(); Output::print("        False (to print as the total number of seconds)");
	Output::newline();
	Output::newline(); Output::print("Default: True (time is converted to days/hours/minutes/seconds)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" tolerance");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Global tolerance used to test floating point values for equality. Two");
	Output::newline(); Output::print("    numbers are taken as equal if the absolute difference between them is less");
	Output::newline(); Output::print("    than this value. Vectors are taken as equal if the length of the vector that");
	Output::newline(); Output::print("    connects their tips is less than this value. All values are converted to the");
	Output::newline(); Output::print("    cartesian coordinate system before testing for equality. This setting can");
	Output::newline(); Output::print("    be controlled from the command line using the -tol function.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of Angstroms where applicable)");
	Output::newline();
	Output::newline(); Output::print("Default: 1e-4");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" clustertol");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: In several functions, Mint expands positions of atoms from the");
	Output::newline(); Output::print("    assymetric unit using the symmetries of the crystal. For atoms not lying on");
	Output::newline(); Output::print("    a general position, a single coordinate can be generated more than one time.");
	Output::newline(); Output::print("    This setting controls the tolerance for atoms generated using symmetry to be");
	Output::newline(); Output::print("    taken as equal. That is, if the distance between two atoms generated by");
	Output::newline(); Output::print("    symmetry is less than this value, then they are considered the same atom");
	Output::newline(); Output::print("    and their positions averaged.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of Angstroms)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.2");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" usestdout");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control whether structures are printed to stdout or to a file. This");
	Output::newline(); Output::print("    can be controlled from the command line using the -print function.");
	Output::newline();
	Output::newline(); Output::print("Values: True (print structures to stdout)");
	Output::newline(); Output::print("        False (print structures to file)");
	Output::newline();
	Output::newline(); Output::print("Default: False (structures are printed to file)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" coordinates");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control whether positions in a crystal are printed using fractional");
	Output::newline(); Output::print("    (direct) or cartesian coordinates. This can be controlled from the command");
	Output::newline(); Output::print("    line using the -print function. Some structure formats only allow");
	Output::newline(); Output::print("    fractional coordinates (but not cartesian), while others the opposite. For");
	Output::newline(); Output::print("    such formats, this setting is ignored and the correct coordinates are used.");
	Output::newline();
	Output::newline(); Output::print("Values: \"Fractional\" or \"cartesian\"");
	Output::newline();
	Output::newline(); Output::print("Default: Fractional");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" strformat");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the format used when printing a structure. This setting can be");
	Output::newline(); Output::print("    controlled from the command line using the -print function.");
	Output::newline();
	Output::newline(); Output::print("Values:");
	Output::newline(); Output::print("    \"mint\" or \".mint\" for mint");
	Output::newline(); Output::print("    \"vasp\", \"vasp5\", \"vasp 5\", \".vasp\", or \".vasp5\" for vasp 5");
	Output::newline(); Output::print("    \"vasp 4\", \"vasp4\", or \".vasp4\" for vasp 4");
	Output::newline(); Output::print("    \"cif\" or \".cif\" for cif");
	Output::newline(); Output::print("    \"crystalmaker\", \"cm\", \"cmtx\", or \".cmtx\" for crystal maker");
	Output::newline(); Output::print("    \"findsym\", \".findsym\", \"fs\", or \".fs\" for findsym");
	Output::newline(); Output::print("    \"quantum\", \"espresso\", \"qe\", or \".qe\" for quantum espresso");
	Output::newline();
	Output::newline(); Output::print("Default: Same as input file");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" overwrite");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control whether structure files can be overwritten. Mint names output");
	Output::newline(); Output::print("    files based on the name of the supplied file, but can alter the name so");
	Output::newline(); Output::print("    that it does not overwrite the original when printed. For example, if a");
	Output::newline(); Output::print("    structure is supplied in the file STR, then when printed, Mint will name");
	Output::newline(); Output::print("    the file STR_1 (or the first STR_N that is not taken, with N as an integer).");
	Output::newline();
	Output::newline(); Output::print("Values: True (to allow original files to be overwritten)");
	Output::newline(); Output::print("        False (to create a unique name each time that a file is printed)");
	Output::newline();
	Output::newline(); Output::print("Default: False (a unique name is generated each time that a file is printed)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" addextension");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Add an extension to structure file names when printing them. The");
	Output::newline(); Output::print("    extension used will depened on the format of the file. For example, files");
	Output::newline(); Output::print("    printed to the VASP format will use the .vasp extension.");
	Output::newline();
	Output::newline(); Output::print("Values: True (add an extension to structure file names)");
	Output::newline(); Output::print("        False (do not add an extension to structure file names)");
	Output::newline();
	Output::newline(); Output::print("Default: True (extensions are added to structure file names)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" randstrmaxloops");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control the number of attempts to create a \"good\" structure when");
	Output::newline(); Output::print("    generated randomly. A structure is considered \"good\" if no two atoms");
	Output::newline(); Output::print("    are separated by a distance less than the minimum desired bond length (see");
	Output::newline(); Output::print("    the randstrminbond setting). If randstrmaxloops loops are made and no");
	Output::newline(); Output::print("    \"good\" structure has been generated, then the best structure up to that");
	Output::newline(); Output::print("    point is taken.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 100");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" randstrminbond");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control the minimum bond length when generating random structures.");
	Output::newline(); Output::print("    The ideal bond length between two atoms, d_ideal, is taken as the sum of");
	Output::newline(); Output::print("    their average covalent radii (http://en.wikipedia.org/wiki/Covalent_radius).");
	Output::newline(); Output::print("    The minimum bond length between two atoms is then defined as");
	Output::newline(); Output::print("    d_min = randstrminbond * d_ideal. In other words, randstrminbond sets the");
	Output::newline(); Output::print("    minimum fraction of the ideal bond length that is allowed. This setting is");
	Output::newline(); Output::print("    tied to the randstrmaxloops setting.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number");
	Output::newline();
	Output::newline(); Output::print("Default: 0.5 (minimum distance is half the ideal distance)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptnumsim");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Control the number of unique simulations to perform during GA-based");
	Output::newline(); Output::print("    structure prediction/solution. For each unique simulation, a new random");
	Output::newline(); Output::print("    initial population is generated. The best structure is taken as the one");
	Output::newline(); Output::print("    that optimizes the set metric (see gaoptmetric setting) best over all");
	Output::newline(); Output::print("    simulations. In other words, this controls the number of restarts that are");
	Output::newline(); Output::print("    performed during GA-based structure prediction.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 1 (only one unique simulation is performed)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptpopsize");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the number of structures in the population during GA-based");
	Output::newline(); Output::print("    structure prediction/solution. This number is kept constant throughout the");
	Output::newline(); Output::print("    simulation.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 10");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptcellmutprob");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Probability of making a change to the unit cell parameters during");
	Output::newline(); Output::print("    GA-based structure prediction/solution. The unit cell is modified with this");
	Output::newline(); Output::print("    probability for each child generated during crossover at every generation");
	Output::newline(); Output::print("    of the GA. Modifications include changes the cell lengths and internal");
	Output::newline(); Output::print("    angles (where allowed by symmetry). This setting is ignored if the unit");
	Output::newline(); Output::print("    cell parameters are fixed for the structure.");
	Output::newline();
	Output::newline(); Output::print("Values: Floating point number between 0 (no mutations) and 1 (always mutate)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.1 (probability of a mutation is 1/10)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptposmutprob");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Probability of making a change to the positions of atoms in the unit");
	Output::newline(); Output::print("    cell during GA-based structure prediction/solution. Positions in a cell are");
	Output::newline(); Output::print("    modified with this probability for each child generated during crossover at");
	Output::newline(); Output::print("    every generation of the GA. All positions in the cell are changed along a");
	Output::newline(); Output::print("    different random vector by a distance randomly selected on the interval");
	Output::newline(); Output::print("    from 0.1 to 0.5 Angstroms. Symmetry is always preserved during mutation");
	Output::newline(); Output::print("    and atoms that are fixed are not moved.");
	Output::newline();
	Output::newline(); Output::print("Values: Floating point number between 0 (no mutations) and 1 (always mutate)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.1 (probability of a mutation is 1/10)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptwyckmutprob");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Probability of changing which Wyckoff sites are occupied in the");
	Output::newline(); Output::print("    structure during GA-based structure prediction/solution. Wyckoff site");
	Output::newline(); Output::print("    occupations are modified with this probability for each child generated");
	Output::newline(); Output::print("    during crossover at every generation of the GA. When an atom changes Wyckoff");
	Output::newline(); Output::print("    sites, the position of the atom is randomly generated so that it obeys its");
	Output::newline(); Output::print("    new site symmetry.");
	Output::newline();
	Output::newline(); Output::print("Values: Floating point number between 0 (no mutations) and 1 (always mutate)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.1 (probability of a mutation is 1/10)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptmetric");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Metric to optimize during GA-based structure prediction/solution. While");
	Output::newline(); Output::print("    multiple metrics can be used to guide the search, this setting controls");
	Output::newline(); Output::print("    which of them is used to determine the \"best\" structure. For example, an");
	Output::newline(); Output::print("    optimization supplied with a potential function and diffraction pattern to");
	Output::newline(); Output::print("    match will use both of these during optimization, but the \"best\" structure");
	Output::newline(); Output::print("    will be the one that has the lowest energy or lowest R-factor (depending on");
	Output::newline(); Output::print("    which metric is passed to this setting). This can also be controlled from");
	Output::newline(); Output::print("    the command line using the -optimize function.");
	Output::newline();
	Output::newline(); Output::print("Values:");
	Output::newline(); Output::print("    \"energy\" or \"potential\" to optimize the energy");
	Output::newline(); Output::print("    \"xray\" or \"diffraction\" to optimize the r-factor");
	Output::newline();
	Output::newline(); Output::print("Default: Energy if it is supplied, otherwise r-factor");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptconverge");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Number of generations without a change for a GA-based structure");
	Output::newline(); Output::print("    prediction/solution calculation to be considered converged. In other words,");
	Output::newline(); Output::print("    if no new \"best\" structure is found after gaoptconverge generations, the");
	Output::newline(); Output::print("    simulation terminates.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 10");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptmaxgens");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Maximum number of generations allowed during GA-based structure");
	Output::newline(); Output::print("    prediction/solution calculation. If the simulation has not converged after");
	Output::newline(); Output::print("    this many generations, then it terminates and the best structure to that");
	Output::newline(); Output::print("    point is returned.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 1000");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptnumtokeep");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Number of structures to keep from one generation to the next during");
	Output::newline(); Output::print("    a GA-based structure prediction/solution calculation. These structures are");
	Output::newline(); Output::print("    unchanged going to the next generation (i.e. no mutations are applied).");
	Output::newline(); Output::print("    Only the best gaoptnumtokeep structures are kept from the generation.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptselection");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Selection method for choosing structures to mate during GA-based");
	Output::newline(); Output::print("    structure prediction/solution calculations.");
	Output::newline();
	Output::newline(); Output::print("Values: \"Roulette\" or \"tournament\"");
	Output::newline();
	Output::newline(); Output::print("Default: Tournament");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptenergytol");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Tolerance used to decide whether an energy is lower than another during");
	Output::newline(); Output::print("    a GA-based structure prediction/solution calculation. For example, if the");
	Output::newline(); Output::print("    \"best\" structure has an energy of 4.00001 eV/atom, it is rather");
	Output::newline(); Output::print("    insignificant if a second structure has an energy of exactly 4.0 eV/atom -");
	Output::newline(); Output::print("    for all practical purposes, the energies are the same. This speeds up");
	Output::newline(); Output::print("    convergence of simulations by preventing \"best\" structure updates when");
	Output::newline(); Output::print("    energy differences are negligibly small.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of eV/atom)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.001");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptdifftol");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Tolerance used to decide whether an R-factor is lower than another");
	Output::newline(); Output::print("    during a GA-based structure prediction/solution calculation. For example,");
	Output::newline(); Output::print("    if the \"best\" structure has an R-factor for 0.020001, it is rather");
	Output::newline(); Output::print("    insignificant if a second structure has an R-factor of exactly 0.02 - for");
	Output::newline(); Output::print("    all practical purposes, the R-factors are the same. This speeds up");
	Output::newline(); Output::print("    convergence of simulations by preventing \"best\" structure updates when");
	Output::newline(); Output::print("    R-factor differences are negligibly small.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number");
	Output::newline();
	Output::newline(); Output::print("Default: 1e-4");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptscreenmethod");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the screening method used when generating children during a");
	Output::newline(); Output::print("    GA-based structure prediction/solution calculation. For example, if the");
	Output::newline(); Output::print("    screening method is set to \"energy\" and gaoptscreennum to 10, then for");
	Output::newline(); Output::print("    each mating operation, ten candidates are generated for each child and the");
	Output::newline(); Output::print("    one with the lowest energy (without relaxation) is taken. Similarly, if");
	Output::newline(); Output::print("    the screening method is set to \"xray\", then of the ten candidates, the");
	Output::newline(); Output::print("    one with the lowest R-factor (again without relaxing positions) is");
	Output::newline(); Output::print("    accepted. Screens are used to improve simulation times by selecting");
	Output::newline(); Output::print("    children nearest to a minimum so that local relaxations occur more rapidly.");
	Output::newline();
	Output::newline(); Output::print("    This is distinct from the number of children in a simulation. For example,");
	Output::newline(); Output::print("    in a simulation with 10 structures in the population and gaoptscreennum");
	Output::newline(); Output::print("    set to 5, for each of the 10 children in a new generation, 5 candidates are");
	Output::newline(); Output::print("    produced and the one that best optimizes the metric defined by");
	Output::newline(); Output::print("    gaoptscreenmethod is accepted as the child. The selected children are");
	Output::newline(); Output::print("    relaxed locally using whichever metric is being optimized in the simulation.");
	Output::newline();
	Output::newline(); Output::print("    In order for a screen to be applied, gaoptscreenmethod must be set and");
	Output::newline(); Output::print("    gaoptscreennum must have a non-zero value. If one or neither of these are");
	Output::newline(); Output::print("    true, then a screen is not used.");
	Output::newline();
	Output::newline(); Output::print("Values: ");
	Output::newline(); Output::print("    \"energy\" or \"potential\" to screen using the energy");
	Output::newline(); Output::print("    \"xray\" or \"diffraction\" to screen using the r-factor");
	Output::newline();
	Output::newline(); Output::print("Default: None (no screen is applied)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" gaoptscreennum");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Set the number of candidates to generate and screen for each child");
	Output::newline(); Output::print("    in each generation of a GA-based structure prediction/solution calculation.");
	Output::newline(); Output::print("    See gaoptscreenmethod for more details.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number");
	Output::newline();
	Output::newline(); Output::print("Default: 0 (no screen is applied)");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" wyckoffbias");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: From analysis of structures in the Inorganic Crystal Structure Database");
	Output::newline(); Output::print("    it was found that atoms tend to occupy Wyckoff site combinations so as to");
	Output::newline(); Output::print("    minimize the number of symmetrically-unique atoms in the structure. For");
	Output::newline(); Output::print("    example, assume that a space group has three Wyckoff sites, two with");
	Output::newline(); Output::print("    multiplicity 1 and one with multiplicity 2. If two atoms were placed in the");
	Output::newline(); Output::print("    structure, then based on this analysis, they would overwhelmingly prefer");
	Output::newline(); Output::print("    to occupy the site with multiplicity 2, rather than some combination of");
	Output::newline(); Output::print("    two sites with multiplicity 1.");
	Output::newline();
	Output::newline(); Output::print("    The exact statistics from this analysis are hard-coded into Mint and used");
	Output::newline(); Output::print("    to determine which Wyckoff sites are selected when randomly placing atoms");
	Output::newline(); Output::print("    into a structure with a set space group. This setting controls the extent");
	Output::newline(); Output::print("    to which these statistics are used. If set to 0, then no biasing is applied");
	Output::newline(); Output::print("    and Wyckoff site combinations are chosen completely at random. If set to 1,");
	Output::newline(); Output::print("    then biasing is maximized. Typically, biasing should be somewhere between");
	Output::newline(); Output::print("    these two extremes. If it is too low, then the simulation may take much");
	Output::newline(); Output::print("    longer to converge. It it is too high, then it can be difficult or even");
	Output::newline(); Output::print("    impossible to find structures that differ significantly from those in the");
	Output::newline(); Output::print("    ICSD, at least with respect to the Wyckoff site occupancies.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number between 0 (no biasing) and 1 (full biasing)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.5");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" minimagedis");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Several functions within Mint generate supercells of structures. This");
	Output::newline(); Output::print("    setting controls the size of the supercell by controlling the minimum image");
	Output::newline(); Output::print("    distance that is allowed in the structure under periodic boundary");
	Output::newline(); Output::print("    conditions. A larger minimum image distance will always lead to a cell");
	Output::newline(); Output::print("    that is at least as large to, if not larger than, a cell with a smaller");
	Output::newline(); Output::print("    minimum image distance.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of Angstroms)");
	Output::newline();
	Output::newline(); Output::print("Default: 8.0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" maxjumpdistance");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Maximum jumps distance allowed when generating jumps between atomic");
	Output::newline(); Output::print("    sites in a structure.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of Angstroms)");
	Output::newline();
	Output::newline(); Output::print("Default: 7.0");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" kmcjumpsperatom");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Number of jumps to perform in a KMC simulation. This setting in given");
	Output::newline(); Output::print("    as a function of the number of atoms in a structure so the actual number");
	Output::newline(); Output::print("    of jumps will depend on the simulation cell size. A larger number will");
	Output::newline(); Output::print("    lead to smaller errors in calculated diffusivities.");
	Output::newline();
	Output::newline(); Output::print("Values: Any integer number (in units of jumps/atom)");
	Output::newline();
	Output::newline(); Output::print("Default: 100");
	Output::newline();
	Output::newline();
	Output::newline();
	Output::newline(); Output::print("================================================================================");
	Output::newline(); Output::print(" kmcconverge");
	Output::newline(); Output::print("================================================================================");
	Output::newline();
	Output::newline(); Output::print("General: Convergence criterion for a KMC simulation to be considered complete.");
	Output::newline(); Output::print("    The simulation is terminated once the standard error is below this value.");
	Output::newline();
	Output::newline(); Output::print("Values: Any floating point number (in units of percent)");
	Output::newline();
	Output::newline(); Output::print("Default: 0.5");
	
	// Reset output method
	Output::method(origMethod);
}
